﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Transactions;
using System.Data.SqlClient;
using System.Data;
using EntitiesLayer;


namespace DAL.Repositories
{

    public class UsuarioRepository : IRepository<Usuario>
    {
        private List<Usuario> insertItems;
        private List<Usuario> deleteItems;
        private List<Usuario> updateItems;

        public UsuarioRepository()
        {
            insertItems = new List<Usuario>();
            updateItems = new List<Usuario>();
            deleteItems = new List<Usuario>();
        }

        public void Save()
        {
            using (TransactionScope scope = new TransactionScope())
            {
                try
                {
                    if (insertItems.Count > 0)
                    {
                        foreach (Usuario usuario in insertItems)
                        {
                            InsertUsuario(usuario);
                        }
                    }

                    if (updateItems.Count > 0)
                    {
                        foreach (Usuario usuario in updateItems)
                        {
                            //UpdateUsuario(usuario);
                        }
                    }

                    if (deleteItems.Count > 0)
                    {
                        foreach (Usuario usuario in deleteItems)
                        {
                            //DeleteUsuario(usuario);
                        }
                    }

                    scope.Complete();
                }
                catch (TransactionAbortedException ex)
                {

                }
                catch (ApplicationException ex)
                {

                }
                finally
                {
                    Clear();
                }
            }
        }

        public void Clear()
        {
            insertItems.Clear();
            deleteItems.Clear();
            updateItems.Clear();
        }
        public void Insert(Usuario entity)
        {
            insertItems.Add(entity);
        }

        public void Update(Usuario entity)
        {

        }

        public List<String> obtenerInfoUsuario(String pcorreo)
        {
            List<String> infousuario = new List<String>();

            try
            {
                SqlCommand sql = new SqlCommand();
                sql.Parameters.Add(new SqlParameter("@correoElectronico", pcorreo));
                DataSet ds = DBAccess.ExecuteSPWithDS(ref sql, "pa_info_usuario");

                if (ds.Tables[0].Rows.Count > 0)
                {
                    foreach (DataRow dr in ds.Tables[0].Rows)
                    {
                        infousuario.Add(dr["nombreUsuario"].ToString());
                        infousuario.Add(dr["carne"].ToString());
                        infousuario.Add(dr["contrasenna"].ToString());
                    }
                }
            }

            catch (Exception)
            {
            }
            return infousuario;
        }

        public Usuario iniciarSesion(String pnumeroCarnet)
        {
            Usuario objUsuario = null;
            try
            {
                SqlCommand sql = new SqlCommand();
                //revisar si los nombres de los parametros son los del procedure o cualquiera sin importar
                sql.Parameters.Add(new SqlParameter("@numero_carnet", pnumeroCarnet));


                DataSet ds = DBAccess.ExecuteSPWithDS(ref sql, "pa_iniciar_sesion");


                if (ds.Tables[0].Rows.Count > 0)
                {
                    int idRol;

                    foreach (DataRow dr in ds.Tables[0].Rows)
                    {
                        objUsuario = new Usuario()
                        {
                            Id = Convert.ToInt32(dr["id"]),
                            PrimerNombre = dr["primer_nombre"].ToString(),
                            SegundoNombre = dr["segundo_nombre"].ToString(),
                            PrimerApellido = dr["primer_apellido"].ToString(),
                            SegundoApellido = dr["segundo_apellido"].ToString(),
                            Identificacion = dr["identificacion"].ToString(),
                            Nacionalidad = dr["nacionalidad"].ToString(),
                            Alias = dr["alias"].ToString(),
                            FechaNacimiento = dr["fecha_nacimiento"].ToString(),
                            CorreoElectronico = dr["correo_electronico"].ToString(),
                            Telefono = dr["telefono"].ToString(),
                            Celular = dr["celular"].ToString(),
                            Estado = Convert.ToBoolean(dr["estado"]),
                            FechaIngreso = dr["fecha_ingreso"].ToString(),
                            TipoIdentificacion = Convert.ToInt32(dr["tipo_identificacion"]),
                            Genero = Convert.ToInt32(dr["genero"]),
                            Objetivo = Convert.ToInt32(dr["objetivo"]),
                            idRol = Convert.ToInt32(dr["rol"])
                        };
                    }
                }
            }

            catch (Exception)
            { }
            return objUsuario;
        }

        public List<String> cargarPermisos(int pidRol)
        {
            List<String> listaPermisos = new List<String>();
            try
            {
                SqlCommand sql = new SqlCommand();

                sql.Parameters.Add(new SqlParameter("@id_rol", pidRol));

                DataSet ds = DBAccess.ExecuteSPWithDS(ref sql, "pa_cargar_permisos");

                if (ds.Tables[0].Rows.Count > 0)
                {
                    foreach (DataRow dr in ds.Tables[0].Rows)
                    {
                        listaPermisos.Add(dr["codigo"].ToString());
                    }
                }
            }
            catch (Exception)
            { }

            return listaPermisos;
        }


        private void InsertUsuario(Usuario usuario)
        {
            try
            {
                SqlCommand cmd = new SqlCommand();
                int estado;
                byte[] fotografia;

                if (usuario.Estado == true)
                {
                    estado = 1;
                }
                else
                {
                    estado = 0;
                }

                if (usuario.Fotografia.Equals(null))
                {
                    fotografia = null;
                }
                else
                {
                    fotografia = usuario.Fotografia;
                }

                cmd.Parameters.Add(new SqlParameter("@primerNombre", usuario.PrimerNombre));
                cmd.Parameters.Add(new SqlParameter("@segundoNombre", usuario.SegundoNombre));
                cmd.Parameters.Add(new SqlParameter("@primerApellido", usuario.PrimerApellido));
                cmd.Parameters.Add(new SqlParameter("@segundoApellido", usuario.SegundoApellido));
                cmd.Parameters.Add(new SqlParameter("@identificacion", usuario.Identificacion));
                cmd.Parameters.Add(new SqlParameter("@nacionalidad", usuario.Nacionalidad));
                cmd.Parameters.Add(new SqlParameter("@alias", usuario.Alias));
                cmd.Parameters.Add(new SqlParameter("@fechaNacimiento", Convert.ToDateTime(usuario.FechaNacimiento)));
                cmd.Parameters.Add(new SqlParameter("@correoElectronico", usuario.CorreoElectronico));
                cmd.Parameters.Add(new SqlParameter("@telefono", usuario.Telefono));
                cmd.Parameters.Add(new SqlParameter("@celular", usuario.Celular));
                cmd.Parameters.Add(new SqlParameter("@contrasena", usuario.Contrasena));
                cmd.Parameters.Add(new SqlParameter("@fechaIngreso", Convert.ToDateTime(usuario.FechaIngreso)));
                cmd.Parameters.Add(new SqlParameter("@estado", estado));
                cmd.Parameters.Add(new SqlParameter("@tipoIdentificacion", usuario.TipoIdentificacion));
                cmd.Parameters.Add(new SqlParameter("@genero", usuario.Genero));
                cmd.Parameters.Add(new SqlParameter("@objetivo", usuario.Objetivo));
                cmd.Parameters.Add(new SqlParameter("@rol", usuario.Rol.Id));
                cmd.Parameters.Add(new SqlParameter("@fotografia", usuario.Fotografia));
                cmd.Parameters.Add(new SqlParameter("@carne", usuario.Carne));

                DataSet ds = DBAccess.ExecuteSPWithDS(ref cmd, "pa_agregar_usuario");
            }
            catch (Exception ex)
            {

            }

        }

        public Boolean comprobarusuario(String pnumeroCarnet, String pcontrasena)
        {
            Boolean existeUsuario = false;

            try
            {
                SqlCommand sql = new SqlCommand();
                //revisar si los nombres de los parametros son los del procedure o cualquiera sin importar
                sql.Parameters.Add(new SqlParameter("@numero_carnet", pnumeroCarnet));
                sql.Parameters.Add(new SqlParameter("@contrasenna", pcontrasena));

                DataSet ds = DBAccess.ExecuteSPWithDS(ref sql, "pa_comprobar_usuario");

                if (ds.Tables[0].Rows.Count > 0)
                {
                    foreach (DataRow dr in ds.Tables[0].Rows)
                    {
                        existeUsuario = Convert.ToBoolean(dr["existeUsuario"]);
                    }
                }
            }
            catch (Exception)
            { }
            return existeUsuario;
        }



        public Boolean comprobarCorreo(String pcorreo)
        {
            Boolean existeCorreo = false;
            try
            {
                SqlCommand sql = new SqlCommand();
                sql.Parameters.Add(new SqlParameter("@correo", pcorreo));
                DataSet ds = DBAccess.ExecuteSPWithDS(ref sql, "pa_comprobar_correo");

                if (ds.Tables[0].Rows.Count > 0)
                {
                    foreach (DataRow dr in ds.Tables[0].Rows)
                    {
                        existeCorreo = Convert.ToBoolean(dr["existeCorreo"]);
                    }
                }
            }
            catch (Exception)
            { }
            return existeCorreo;
        }

        #region metodos no implementados
        public IEnumerable<Usuario> GetAll()
        {
            List<Usuario> listaUsuarios = null;
            SqlCommand cmd = new SqlCommand();
            DataSet ds = null;

            ds = DBAccess.ExecuteSPWithDS(ref cmd, "pa_consultar_usuarios");

            if (ds.Tables[0].Rows.Count > 0)
            {
                listaUsuarios = new List<Usuario>();
                foreach (DataRow dr in ds.Tables[0].Rows)
                {
                    listaUsuarios.Add(new Usuario()
                    {
                        Id = Convert.ToInt32(dr["id_usuario"]),
                        PrimerNombre = dr["primer_nombre"].ToString(),
                        SegundoNombre = dr["segundo_nombre"].ToString(),
                        PrimerApellido = dr["primer_apellido"].ToString(),
                        SegundoApellido = dr["segundo_apellido"].ToString(),
                        Identificacion = dr["identificacion"].ToString(),
                        Nacionalidad = dr["nacionalidad"].ToString(),
                        Alias = dr["alias"].ToString(),
                        FechaNacimiento = dr["fecha_nacimiento"].ToString(),
                        CorreoElectronico = dr["correo_electronico"].ToString(),
                        Telefono = dr["telefono"].ToString(),
                        Celular = dr["celular"].ToString(),
                        Estado = Convert.ToBoolean(dr["estado"]),
                        FechaIngreso = dr["fecha_ingreso"].ToString(),
                        TipoIdentificacion = Convert.ToInt32(dr["tipo_identificacion"]),
                        Genero = Convert.ToInt32(dr["genero"]),
                        Objetivo = Convert.ToInt32(dr["objetivo"])
                    });
                }
            }

            return listaUsuarios;
        }

        public void Delete(Usuario entity)
        {

        }

        public Usuario GetById(int pid)
        {
            return null;
        }
        #endregion
    }
}